package com.yueke.gemini.wxpublicapi;


import com.yueke.gemini.redis.RedisClient;
import com.yueke.gemini.redis.RedisManager;
import com.yueke.gemini.utils.RestUtils;
import com.yueke.gemini.utils.StringUtil;
import com.yueke.gemini.wxpublicapi.accesstoken.AccessToken;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * access_token是公众号的全局唯一接口调用凭据，公众号调用各接口时都需使用access_token。
 * 开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。

 access_token的有效期目前为2个小时，需定时刷新，重复获取将导致上次获取的access_token失效。
 主要是在调用很多微信接口的时候需要使用到accessToken作为凭证，

 所以说这个东西是微信公众号开发时必须进行获取的！
 * Created by admin on 2017/5/15.
 */
public class AccessTokenUtil {
    private static final Logger logger = LoggerFactory.getLogger(AccessTokenUtil.class);

    /**
     * 获取accessToken
     * @param appID 微信公众号凭证
     * @param appScret 微信公众号凭证秘钥
     * @return
     */
    public static AccessToken getAccessToken(String appID, String appScret) {
        logger.info("获取微信公众号调用凭证");
        AccessToken token = new AccessToken();
        RedisClient rc= RedisManager.getInstance();
        String access_token = StringUtil.valueOf(rc.get("access_token"));
        token.setAccess_token(access_token);
        if (StringUtil.isNull(access_token)){
            try {
                String url = WxApiUrl.GET_ACCESS_TOKEN.replaceAll("APPID",appID).replaceAll("APPSECRET",appScret);
                String result = RestUtils.sendRequest(url,null,"GET");
                System.out.println("AccessToken:"+result);
                if (result!=null){
                    JSONObject jo = new JSONObject(result);
                    if (jo!=null && jo.has("errcode") ){
                       logger.error("获取access_token失败",jo.optString("errCode"));
                    }else {
                        token.setAccess_token(jo.optString("access_token"));
                        token.setExpires_in(jo.optLong("expires_in"));
                    }
                    rc.set("access_token",jo.optString("access_token"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return token;
    }
}
